package com.atguigu.hbase.util;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Table;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @ClassName TableUtils
 * @DeScription Hbase中Table操作工具类
 * @Author 剧情再美终是戏
 * @Date 2019/12/8 8:11
 * @Version 1.0
 **/
public class TableUtils {

    private TableUtils() {
    }

    private static Logger logger = LoggerFactory.getLogger(TableUtils.class);

    /**
     * 判断表是否存在
     *
     * @param conn   Hbase连接
     * @param nsName 库的名称，如果库为空,就使用default库
     * @param name   库的名称
     * @return boolean
     * @Author 剧情再美终是戏
     * @Date 2019/12/8
     * @Version 1.0
     **/
    public static boolean existsTable(Connection conn, String nsName, String name) {
        if (null == conn || StringUtils.isBlank(name)) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.existsTable Method Param Error : conn, name  is require!");
            return false;
        }

        // 获取tableName对象
        TableName tn = TableName.valueOf(nsName, name);

        // 判断表是否存在
        try (Admin admin = conn.getAdmin()) {
            return admin.tableExists(tn);
        } catch (Exception e) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.existsTable method param error : " + e);
            return false;
        }
    }


    /**
     * hTableDescriptor
     *
     * @param conn   Hbase连接
     * @param nsName 库的名称，如果库为空,就使用default库
     * @param name   库的名称
     * @param cfs    列族（可以传多个）
     * @return boolean
     * @Author 剧情再美终是戏
     * @Date 2019/12/8
     * @Version 1.0
     **/
    public static boolean createTable(Connection conn, String nsName, String name, String... cfs) {
        if (null == conn || StringUtils.isBlank(name) || ArrayUtils.isEmpty(cfs)) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.createTable Method Param Error : conn, name, cfs is require!");
            return false;
        }

        // 判断表是否存在
        if (existsTable(conn, nsName, name)) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.existsTable method happen error  : table is exists");
            return false;
        }

        // 获取tableName对象
        TableName tn = TableName.valueOf(nsName, name);

        try (Admin admin = conn.getAdmin()) {
            // 创建表的描述器
            HTableDescriptor hTableDescriptor = new HTableDescriptor(tn);
            for (String cf : cfs) {
                // 创建列族的描述器
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
                hTableDescriptor.addFamily(hColumnDescriptor);
            }
            // 创建表
            admin.createTable(hTableDescriptor);
            return true;
        } catch (Exception e) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.existsTable method happen error : " + e);
            return false;
        }
    }

    /**
     * 查询表信息
     *
     * @param conn   Hbase连接
     * @param nsName 库的名称，如果库为空,就使用default库
     * @param name   库的名称
     * @return org.apache.hadoop.hbase.HTableDescriptor
     * @Author 剧情再美终是戏
     * @Date 2019/12/8
     * @Version 1.0
     **/
    public static HTableDescriptor getTableDesc(Connection conn, String nsName, String name) {
        if (null == conn || StringUtils.isBlank(name)) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.getTableDesc Method Param Error : conn, name is require!");
            return null;
        }

        // 获取tableName对象
        TableName tn = TableName.valueOf(nsName, name);

        // 查询表信息
        try (Admin admin = conn.getAdmin()) {
            return admin.getTableDescriptor(tn);
        } catch (Exception e) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.getTableDesc method param error : " + e);
            return null;
        }
    }

    // 删除表
    public static boolean delTable(Connection conn, String nsName, String name) {
        if (null == conn || StringUtils.isBlank(name)) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.delTable Method Param Error : conn, name is require!");
            return false;
        }

        // 获取tableName对象
        TableName tn = TableName.valueOf(nsName, name);

        try (Admin admin = conn.getAdmin()) {
            // ①禁用表
            admin.disableTable(tn);

            // ②删除表
            admin.deleteTable(tn);

            return true;
        } catch (Exception e) {
            logger.error("com.atguigu.hbase.util.NameSpaceUtils.delTable method param error : " + e);
            return false;
        }
    }
}
